import { DecimalDigits } from "./validation"

/**
 * 消息提示
 * @param title 标题
 * @param duration 时间
 * @param image 图标
 */
export const showToast = (title: string, duration = 2000, image?: string) => {
  uni.showToast({ title, icon: "none", image, mask: true, duration })
}

/**
 * @description 用于获取用户传递值的px值  如果用户传递了"xxpx"或者"xxrpx"，取出其数值部分，如果是"xxxrpx"还需要用过uni.upx2px进行转换
 * @param {number|string} value 用户传递值的px值
 * @param {boolean} unit
 * @returns {number|string}
 */
export const getPx = (value: string, unit = false) => {
  if (DecimalDigits(value)) {
    return unit ? `${value}px` : Number(value)
  }
  // 如果带有rpx，先取出其数值部分，再转为px值
  if (/(rpx|upx)$/.test(value)) {
    return unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value)))
  }
  return unit ? `${parseInt(value)}px` : parseInt(value)
}

/**
 * @description 添加单位，如果有rpx，upx，%，px等单位结尾或者值为auto，直接返回，否则加上px单位结尾
 * @param {string|number} value 需要添加单位的值
 * @param {string} unit 添加的单位名 比如px
 */
export const addUnit = (value = "auto", unit = "px") => {
  value = String(value)
  // 用uView内置验证规则中的number判断是否为数值
  return DecimalDigits(value) ? `${value}${unit}` : value
}

/**
 * @description 获取系统信息同步接口
 * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync
 */
export const sys = () => {
  return uni.getSystemInfoSync()
}

/**
 * @description 运行期判断平台
 * @returns {string} 返回所在平台(小写)
 * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台
 */
export const os = () => {
  return sys().platform.toLowerCase()
}

/**
 * 查询节点信息
 * 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸，为支付宝的bug(2020-07-21)
 * 解决办法为在组件根部再套一个没有任何作用的view元素
 * @param selector
 * @param all
 * @returns
 */
export const $uGetRect = (selector: string, all?: any) => {
  return new Promise((resolve) => {
    const query = uni.createSelectorQuery().in(this)
    const selectCom = query[all ? "selectAll" : "select"](selector)
    console.log(query, selectCom)
    const rect = selectCom.boundingClientRect((rect) => {
      if (all && Array.isArray(rect) && rect.length) resolve(rect)
      if (!all && rect) resolve(rect)
    })
    rect.exec()
  })
}

/**
 * @description 进行延时，以达到可以简写代码的目的 比如: await uni.$u.sleep(20)将会阻塞20ms
 * @param {number} value 堵塞时间 单位ms 毫秒
 * @returns {Promise} 返回promise
 */
export const sleep = (value = 30) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(null)
    }, value)
  })
}

// 跳转方式
export const handleNavigateTo = (url:string) => {
  uni.navigateTo({ url })
}
export const handleRedirectTo = (url:string) => {
  uni.redirectTo({ url })
}
export const handleReLaunch = (url:string) => {
  uni.reLaunch({ url })
}
export const handleSwitchTab = (url:string) => {
  uni.switchTab({ url })
}
export const handleNavigateBack = (delta = 1) => {
  uni.navigateBack({ delta })
}
